<?php
/*
 * @Description: 
 */

namespace app\controller;

use app\BaseController;
use app\model\User;
use app\model\Profile;
use app\model\Role;

class Link extends BaseController
{
  public function index()
  {
    // 测试一对一连表查询
    // 查询的是子表，关联的是主表
    $user = User::find(9); // 查询副表中的外键，来关联主表
    // 关联查询
    $profile = $user->profile;
    $profile = $user->profile->hobby;

    // 使用 save()方法，可以设置关联修改，通过主表修改附表字段的值：
    $user = User::find(9);
    $user->profile->save(['hobby' => '看电影']);

    // ->**profile** 属性方式可以修改数据，->**profile**()方法方式可以新增数据：
    $user = User::find(9);
    $user->profile()->save(['hobby' => '看电影']);

    // belongsTo 模式，适合附表关联主表，具体设置方式如下:

    return json($profile);
  }
  // 副表查询
  public function profile()
  {
    // 附表
    $profile = Profile::find(9);
    // 访问关联主表
    $user = $profile->user;

    // 使用 hasOne()也能模拟 belongsTo() 来进行查询，这样就可以不用在 Profile 模型进行设置：
    $user = User::hasWhere('profile', ['id' => 9])->find();

    // 闭包方式
    $user = User::hasWhere('profile', function ($query) {
      $query->where('id', 9);
    })->find();
    return json($user);
  }

  // 一对多关联查询
  public function hasMany()
  {
    $user = User::find(9);
    // 关联查询关联主表9的所有数据
    $data = $user->profile;
    // 关联查询关联主表9的id为大于等于100的数据
    $data = User::find(1)->profile()->where('id', '>=', 100)->select();

    // 使用 has()方法，查询关联附表的主表内容，比如大于等于 2 条的主表记录；
    //  附表关联主表大于等于4条的数据
    $data = User::has('profile', '>=', 4)->select();

    // 使用 hasWhere()方法，查询附表中，可见兴趣的主表记录；
    // 附表中可见兴趣的主表记录
    $data = User::hasWhere('profile', ['visible' => 1])->select();

    // 使用 save()和 saveAll()进行关联新增和批量关联新增，方法如下：
    $obj = [
      'user_id' => 9,
      'hobby' => '看电影',
      'visible' => 1,
    ];
    $user->profile()->save($obj);
    // 批量关联新增
    $user->profile()->saveAll([$obj, $obj]);

  
    return json($data);
  }
  // 一对多关联查询 -删除
  public function delete(){ 
    // - 使用 together()方法，可以删除主表内容时，将附表关联的内容全部删除；
    $user = User::with("profile")->find(9);
    $user->together(['profile'])->delete();
    return json($user);
  }

  // 多对多关联查询
  public function manyToMany()
  {
    $user = User::find(29);
    // 获取用户的所有角色
    $roles = $user->roles;

    // 添加详情
    $user->roles()->save(["type" => "测试"]);
    // 也支持批量
    // $user->roles()->saveAll([["type" => "测试1"],["type" => "测试2"]]);

    // $user->roles()->save(1);
    // 给用户ID1添加一个已经存在的角色，直接传角色ID即可
      // $user->role()->save(1);

      // // 或
      // $user->role()->save(Role::find(1));
      // $user->role()->saveAll([1,2,3]); 

      // // 或，如果有其它字段，可以通过中括号添加
      // $user->role()->attach(1);
      // $user->role()->attach(2, ["details"=>"测试详情"]);
      // 取消掉张三的所有，1，2，6，这里的值是角色的ID，不是中间表ID
    // $user->role()->detach(1);
    // $user->role()->detach([2, 6]);
    return json($roles);
  }
}
